网络编程2:多进程TCP服务器的设计 | 您所在的位置:网站首页 › accept in › 网络编程2:多进程TCP服务器的设计 |
返回:Linux网络编程学习笔记 1.多进程TCP服务器的代码框架 主要的步骤如下,需要注意的点: (1)父进程仅仅用于监听,对应pid>0,需要关闭连接套接字conn_fd; (2)子进程仅仅用于连接后的数据传输,对应pid=0,需要关闭监听套接字listen_fd; (3)如果没有连接请求时,客户端accept函数一直处于阻塞状态,直到内核完成3次握手并返回连接结果。 2.accept与fork函数功能验证 验证方法如下: (1)通过在accept函数上下添加printf调试打印,确认accept的阻塞状态; (2)通过打印pid,确认当前处于父进程还子进程。 while (1) { pid_t pid = -1; printf("accept() in\n");//accept调试打印 if ((newfd = accept (fd, (struct sockaddr *) &cin, &addrlen)) < 0) { perror ("accept"); break; } printf("accept() out\n");//accept调试打印 /*创建一个子进程用于处理已建立连接的客户的交互数据*/ if ((pid = fork()) < 0) { perror("fork"); break; } printf("pid=%d\n",getpid());//打印进程号 if (0 == pid) { //子进程中 close(fd); char ipv4_addr[16]; if (!inet_ntop (AF_INET, (void *) &cin.sin_addr, ipv4_addr, sizeof (cin))) { perror ("inet_ntop"); exit (1); } printf ("Clinet(%s:%d) is connected!\n", ipv4_addr, ntohs(cin.sin_port)); cli_data_handle(&newfd); return 0; } else { //实际上此处 pid >0, 父进程中 close(newfd); } }3.运行结果 下方2850是父进程,2852和2854均为子进程 (1)在无连接建立时,2850一直阻塞在accept那里,打印accept in; (2)当有TCP连接建立后,里面打印accept out,此时还在父进程中,父进程在关闭conn_fd后,有回到accept那里阻塞; (3)后面的pid=2852和后两行,是第一个子进程中的打印,负责TCP数据处理。 (1)启动服务程序 root@wang-virtual-machine:/home/wang/03-linux-net-work/0411-multi-tcp# ./Service Server starting....OK! accept() in (2)使用nc 192.168.31.59 5001命令启动第一个客户端 accept() out pid=2850 accept() in pid=2852 Clinet(192.168.31.59:55802) is connected! Child handling process: newfd =4 (3)使用nc 192.168.31.59 5001命令启动第二个客户端 accept() out pid=2850 accept() in pid=2854 Clinet(192.168.31.59:55804) is connected! Child handling process: newfd =44.参考链接: 1.TCP网络编程中connect()、listen()和accept()三者之间的关系 2.fork真的详解(太好的东西) 3.Linux网络编程基础-04_TCP/IP网络编程-并发服务器
|
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |